package cn.com.platform.dao;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;

import cn.com.platform.entity.ArticleEntity;

/**
 * 文章dao
 * 
 * @author nibili 2018年7月17日
 * 
 */
public interface ArticleDao extends JpaRepository<ArticleEntity, Long>, JpaSpecificationExecutor<ArticleEntity> {
	/**
	 * 文章列表
	 * 
	 * @param pageable
	 * @return
	 */
	@Query("select a from ArticleEntity a where a.closed=false and a.audit=true")
	public List<ArticleEntity> getArticleList(Pageable pageable);

	/**
	 * 文章列表
	 * 
	 * @param pageable
	 * @return
	 */
	@Query("select a from ArticleEntity a where a.closed=false and a.audit=true")
	public Page<ArticleEntity> getArticleListByPage(Pageable pageable);

	/**
	 * 文章列表
	 * 
	 * @param pageable
	 * @return
	 */
	@Query("select a from ArticleEntity a where a.closed=false and a.audit=true and title like %?1%")
	public Page<ArticleEntity> getArticleListByPage(String searchValue, Pageable pageable);

	/**
	 * 分类下的文章
	 * 
	 * @param cateId
	 * @param pageable
	 * @return
	 */
	@Query("select a from ArticleEntity a where a.cateId=?1 and a.closed=false and a.audit=true ")
	public Page<ArticleEntity> getArticleListByCateId(Long cateId, Pageable pageable);

	/**
	 * 根据多个分类id获取文章列表
	 * 
	 * @param cateIds
	 * @param pageable
	 * @return
	 * @author lmh 2016年8月10日
	 */
	@Query("select a from ArticleEntity a where a.cateId in ?1 and a.closed=false and a.audit=true ")
	public Page<ArticleEntity> getArticleListByCateIds(List<Long> cateIds, Pageable pageable);

	/**
	 * 通过分类id判断分类下是否还有未删除文章
	 * 
	 * @param cateId
	 * @return
	 * @author wxy 2016年8月4日
	 */
	@Query("select a from ArticleEntity a where a.cateId=?1 and a.deleteStatus=?2")
	public List<ArticleEntity> findArticleListByCateId(Long cateId, boolean deleteStatus);

	/**
	 * 上一篇文章.
	 * 
	 * @param articleId
	 * @return
	 * @author lmh 2016年8月7日
	 */
	@Query("from ArticleEntity a where a.id = (select max(b.id) from ArticleEntity b where b.id < ?1 order by b.id desc)")
	public ArticleEntity getPrevArticle(Long articleId);

	/**
	 * 下一篇文章
	 * 
	 * @param articleId
	 * @return
	 * @author lmh 2016年8月7日
	 */
	@Query("from ArticleEntity a where a.id = (select min(b.id) from ArticleEntity b where b.id > ?1 order by b.id asc)")
	public ArticleEntity getNextArticle(Long articleId);

	/**
	 * 通过id与标题获取对象（删除使用）
	 * 
	 * @param id
	 * @param title
	 * @return
	 * @author wxy 2016年8月19日
	 */
	public ArticleEntity findByIdAndTitle(Long id, String title);

}
